package com.lin.gameserver.websocket;

import com.lin.gameserver.util.HexUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 消息日志记录器，专门用于记录WebSocket消息的收发情况
 */
public class MessageLogger {
    private static final Logger logger = LoggerFactory.getLogger(MessageLogger.class);
    
    // 打印消息的最大字节数
    private static final int MAX_DUMP_BYTES = 32;
    
    /**
     * 记录收到的消息
     *
     * @param sessionId 会话ID
     * @param message 消息内容
     */
    public static void logReceived(String sessionId, byte[] message) {
        logger.debug("RECV [{}] length={} bytes, data={}", 
                sessionId, 
                message.length,
                HexUtil.toHexString(message, MAX_DUMP_BYTES));
    }
    
    /**
     * 记录发送的消息
     *
     * @param sessionId 会话ID
     * @param message 消息内容
     */
    public static void logSent(String sessionId, byte[] message) {
        logger.debug("SENT [{}] length={} bytes, data={}", 
                sessionId, 
                message.length,
                HexUtil.toHexString(message, MAX_DUMP_BYTES));
    }
    
    /**
     * 记录协议解析错误
     *
     * @param sessionId 会话ID
     * @param message 消息内容
     * @param error 错误信息
     */
    public static void logParseError(String sessionId, byte[] message, String error) {
        logger.error("PARSE_ERROR [{}] error={}, data={}", 
                sessionId, 
                error,
                HexUtil.toHexString(message, MAX_DUMP_BYTES));
    }
    
    /**
     * 记录协议处理错误
     *
     * @param sessionId 会话ID
     * @param cmd 命令号
     * @param error 错误信息
     */
    public static void logProcessError(String sessionId, int cmd, String error) {
        logger.error("PROCESS_ERROR [{}] cmd={}, error={}", 
                sessionId, 
                cmd,
                error);
    }
    
    /**
     * 记录会话事件
     *
     * @param sessionId 会话ID
     * @param event 事件类型
     */
    public static void logSessionEvent(String sessionId, String event) {
        logger.info("SESSION_EVENT [{}] {}", sessionId, event);
    }
    
    /**
     * 记录消息处理时间
     *
     * @param sessionId 会话ID
     * @param cmd 命令号
     * @param timeMs 处理时间（毫秒）
     */
    public static void logProcessTime(String sessionId, int cmd, long timeMs) {
        if (timeMs > 100) {
            // 如果处理时间超过100毫秒，记录为警告
            logger.warn("SLOW_PROCESS [{}] cmd={}, time={}ms", sessionId, cmd, timeMs);
        } else {
            logger.debug("PROCESS_TIME [{}] cmd={}, time={}ms", sessionId, cmd, timeMs);
        }
    }
} 